In modern computer systems, paging is used for allocating system memory to different devices and processes operating on a system. This enables each process to have its own virtual address space that is mapped to an available physical address in the system. Thus, paging requires memory accesses to go through a translation process to map from a virtual address to a physical address. These address translations are cached in a translation lookaside buffer (TLB) to avoid the need to repeatedly perform a full page walk to perform a translation. When a TLB is shared by different agents, it is desirable to partition the TLB into different sections to prevent thrashing between the agents. However, a typical set associative TLB having a small number of ways, does not provide sufficient resolution to partition it effectively (e.g., by assigning different ways to different agents).